home *** CD-ROM | disk | FTP | other *** search
/ PC World 2007 June / PCWorld_2007-06_cd.bin / v cisle / tclock / tclocklight-040702-3.exe / source / dll / tooltip.c < prev    next >
C/C++ Source or Header  |  2004-01-10  |  6KB  |  242 lines

  1. /*-------------------------------------------------------------
  2.   tooltip.c : tooltip of the clock
  3.   (C) 1997-2003 Kazuto Sato
  4.   Please read readme.txt about the license.
  5.   
  6.   Written by Kazubon, Nanashi-san
  7. ---------------------------------------------------------------*/
  8.  
  9. #include "tcdll.h"
  10.  
  11. #define TTS_BALLOON    0x40
  12.  
  13. #define TTM_SETMAXTIPWIDTH (WM_USER + 24)
  14.  
  15. /* Globals */
  16. void InitTooltip(HWND hwndClock);
  17. void EndTooltip(HWND hwndClock);
  18. void OnTooltipMouseMsg(HWND hwndClock,
  19.     UINT message, WPARAM wParam, LPARAM lParam);
  20. BOOL OnTooltipNotify(HWND hwndClock, LRESULT *pres, const LPNMHDR pnmh);
  21. void TooltipCheckCursor(HWND hwndClock);
  22. void TrackTooltip(HWND hwndClock, BOOL bShow);
  23.  
  24. /* Statics */
  25.  
  26. LRESULT CALLBACK WndProcTip(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam);
  27.  
  28. static HWND m_hwndTip = NULL;
  29. static WNDPROC m_oldWndProc = NULL;
  30. static BOOL m_bTooltipShow = FALSE;
  31. static BOOL m_bUpdate = FALSE;
  32. static BOOL m_bTip1 = TRUE;
  33. static wchar_t m_format[BUFSIZE_TOOLTIP];
  34. static wchar_t m_textToolTip[BUFSIZE_TOOLTIP];
  35. static char *m_section = "Tooltip";
  36.  
  37. /*------------------------------------------------
  38.   create tooltip window
  39. --------------------------------------------------*/
  40. void InitTooltip(HWND hwndClock)
  41. {
  42.     TOOLINFO ti;
  43.     LONG style;
  44.     char s[BUFSIZE_TOOLTIP];
  45.     int n;
  46.     
  47.     style = GetMyRegLong(NULL, "BalloonFlg", 0);
  48.     style = GetMyRegLong(m_section, "Style", style);
  49.     
  50.     m_hwndTip = CreateWindow(TOOLTIPS_CLASS, (LPSTR)NULL,
  51.         WS_POPUP|TTS_NOPREFIX|TTS_ALWAYSTIP |
  52.             ((style == 1)? TTS_BALLOON : 0),
  53.         CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT,
  54.         NULL, NULL, g_hInst, NULL);
  55.     
  56.     SetWindowPos(m_hwndTip, HWND_TOPMOST, 0, 0, 0, 0,
  57.         SWP_NOSIZE|SWP_NOMOVE|SWP_NOACTIVATE);
  58.     
  59.     ti.cbSize = sizeof(TOOLINFO);
  60.     ti.uFlags = 0;
  61.     ti.hwnd = hwndClock;
  62.     ti.hinst = NULL;
  63.     ti.uId = 1;
  64.     ti.lpszText = LPSTR_TEXTCALLBACK;
  65.     ti.rect.left = 0;
  66.     ti.rect.top = 0;
  67.     ti.rect.right = 480; 
  68.     ti.rect.bottom = 480;
  69.     
  70.     m_oldWndProc = (WNDPROC)SetWindowLong(m_hwndTip, GWL_WNDPROC,
  71.         (LONG)WndProcTip);
  72.     
  73.     m_bTip1 = GetMyRegLong(m_section, "Tip1Use", TRUE);
  74.     
  75.     GetMyRegStr(m_section, "Tooltip", s, BUFSIZE_TOOLTIP-4,
  76.         "\"TClock\" LDATE");
  77.     if(strstr(s, "<%"))
  78.         MultiByteToWideChar(CP_ACP, 0, s, -1, m_format, BUFSIZE_TOOLTIP-1);
  79.     else
  80.     {
  81.         wcscpy(m_format, L"<%");
  82.         MultiByteToWideChar(CP_ACP,
  83.             0, s, -1, m_format + 2, BUFSIZE_TOOLTIP-5);
  84.         wcscat(m_format, L"%>");
  85.     }
  86.     
  87.     n = GetMyRegLong(NULL, "TipDispTime", 5);
  88.     n = GetMyRegLong(m_section, "DispTime", n);
  89.     SendMessage(m_hwndTip, TTM_SETDELAYTIME, TTDT_AUTOPOP, n * 1000);
  90.     
  91.     SendMessage(m_hwndTip, TTM_ADDTOOL, 0, (LPARAM)&ti);
  92.     SendMessage(m_hwndTip, TTM_ACTIVATE, TRUE, 0);
  93. }
  94.  
  95. /*------------------------------------------------
  96.   clean up
  97. --------------------------------------------------*/
  98. void EndTooltip(HWND hwndClock)
  99. {
  100.     DestroyWindow(m_hwndTip);
  101. }
  102.  
  103. /*------------------------------------------------
  104.   window procedure of subclassified tooltip
  105. --------------------------------------------------*/
  106. LRESULT CALLBACK WndProcTip(HWND hwnd, UINT message,
  107.     WPARAM wParam, LPARAM lParam)
  108. {
  109.     if(message == WM_WINDOWPOSCHANGING)
  110.     {
  111.         HWND hwndClock = GetClockWindow();
  112.         LPWINDOWPOS pwp = (LPWINDOWPOS)lParam;
  113.         RECT rcClock, rcTip;
  114.         int hscreen, h;
  115.         
  116.         if(!(pwp->flags & SWP_NOMOVE))
  117.         {
  118.             GetWindowRect(hwndClock, &rcClock);
  119.             GetWindowRect(hwnd, &rcTip);
  120.             hscreen = GetSystemMetrics(SM_CYSCREEN);
  121.             h = rcTip.bottom - rcTip.top;
  122.             
  123.             if(rcClock.top > hscreen / 2)
  124.                 pwp->y = rcClock.top - h;
  125.             else
  126.             {
  127.                 if(pwp->y < rcClock.bottom)
  128.                     pwp->y = rcClock.bottom;
  129.             }
  130.             return 0;
  131.         }
  132.     }
  133.     else if(message == WM_MOUSEMOVE) return 0;
  134.     
  135.     return CallWindowProc(m_oldWndProc, hwnd, message, wParam, lParam);
  136. }
  137.  
  138. /*------------------------------------------------
  139.   mouse message of clock window
  140. --------------------------------------------------*/
  141. void OnTooltipMouseMsg(HWND hwndClock,
  142.     UINT message, WPARAM wParam, LPARAM lParam)
  143. {
  144.     MSG msg;
  145.     
  146.     if(!m_hwndTip) return;
  147.     if(!m_bTip1) return;
  148.     
  149.     m_bUpdate = FALSE;
  150.     
  151.     msg.hwnd = hwndClock;
  152.     msg.message = message;
  153.     msg.wParam = wParam;
  154.     msg.lParam = lParam;
  155.     msg.time = GetMessageTime();
  156.     msg.pt.x = LOWORD(GetMessagePos());
  157.     msg.pt.y = HIWORD(GetMessagePos());
  158.     SendMessage(m_hwndTip, TTM_RELAYEVENT, 0, (LPARAM)&msg);
  159. }
  160.  
  161. /*------------------------------------------------
  162.   WM_NOTIFY message
  163. --------------------------------------------------*/
  164. BOOL OnTooltipNotify(HWND hwndClock, LRESULT *pres, const LPNMHDR pnmh)
  165. {
  166.     UINT code;
  167.     
  168.     if(pnmh->hwndFrom != m_hwndTip) return FALSE;
  169.     code = pnmh->code;
  170.     
  171.     switch(code)
  172.     {
  173.         case TTN_NEEDTEXT:
  174.         case TTN_NEEDTEXTW:
  175.         {
  176.             wchar_t text[BUFSIZE_TOOLTIP];
  177.             
  178.             SendMessage(m_hwndTip, TTM_SETMAXTIPWIDTH, 0, 300);
  179.             
  180.             MakeFormat(text, NULL, m_format, BUFSIZE_TOOLTIP);
  181.             
  182.             if(code == TTN_NEEDTEXT)
  183.             {
  184.                 WideCharToMultiByte(CP_ACP,
  185.                     0, text, -1,
  186.                     (char*)m_textToolTip, BUFSIZE_TOOLTIP-1, NULL, NULL);
  187.                 ((LPTOOLTIPTEXT)pnmh)->lpszText = (char*)m_textToolTip;
  188.             }
  189.             else if(code == TTN_NEEDTEXTW)
  190.             {
  191.                 wcscpy(m_textToolTip, text);
  192.                 ((LPTOOLTIPTEXTW)pnmh)->lpszText = m_textToolTip;
  193.             }
  194.             *pres = 0;
  195.             
  196.             return TRUE;
  197.         }
  198.         case TTN_SHOW:
  199.             if(!m_bTooltipShow)
  200.             {
  201.                 SetWindowPos(m_hwndTip, HWND_TOPMOST,
  202.                     0, 0, 0, 0,
  203.                     SWP_NOSIZE|SWP_NOMOVE|SWP_NOACTIVATE);
  204.                 m_bTooltipShow = TRUE;
  205.             }
  206.             break;
  207.         case TTN_POP:
  208.             m_bTooltipShow = FALSE;
  209.             m_bUpdate = FALSE;
  210.             break;
  211.     }
  212.     return FALSE;
  213. }
  214.  
  215. /*------------------------------------------------
  216.   update tooltip
  217. --------------------------------------------------*/
  218. void OnTimerTooltip(HWND hwndClock)
  219. {
  220.     TOOLINFO ti;
  221.     RECT rc;
  222.     POINT pt;
  223.     
  224.     if(!m_hwndTip) return;
  225.     
  226.     if(m_bUpdate || IsWindowVisible(m_hwndTip)) return;
  227.     
  228.     GetWindowRect(hwndClock, &rc);
  229.     GetCursorPos(&pt);
  230.     
  231.     if(PtInRect(&rc, pt)) return;
  232.     
  233.     memset(&ti, 0, sizeof(TOOLINFO));
  234.     ti.cbSize = sizeof(TOOLINFO);
  235.     ti.hwnd = hwndClock;
  236.     ti.uId = 1;
  237.     ti.lpszText = LPSTR_TEXTCALLBACK;
  238.     SendMessage(m_hwndTip, TTM_UPDATETIPTEXT, 0, (LPARAM)(LPTOOLINFO)&ti);
  239.     m_bUpdate = TRUE;
  240. }
  241.  
  242.